package files

import (
	"errors"
	"os"
	"os/exec"
	"path/filepath"
	"strings"
)

// CurrentDir 获取当前可执行文件所在的目录路径。
//
// 返回值:
//   - string: 目录路径(以路径分隔符结尾)
//   - error: 获取过程中出现的错误
//
// 注意:
//   - 返回的路径以'/'或'\'结尾
//   - 适用于获取程序运行目录
func CurrentDir() (string, error) {
	file, err := exec.LookPath(os.Args[0])
	if err != nil {
		return "", err
	}
	path, err := filepath.Abs(file)
	if err != nil {
		return "", err
	}
	i := strings.LastIndex(path, "/")
	if i < 0 {
		i = strings.LastIndex(path, "\\")
	}
	if i < 0 {
		return "", errors.New(`error: Can't find "/" or "\".`)
	}
	return path[0 : i+1], nil
}

// PathExists 检查路径是否存在(文件或目录)。
//
// 参数:
//   - path: 要检查的路径
//
// 返回值:
//   - bool: 路径存在返回true
//   - error: 检查过程中出现的错误
func PathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}

// CreateDir 创建一个或多个目录(包括所有必要的父目录)。
//
// 参数:
//   - dirs: 要创建的目录路径(可变参数)
//
// 返回值:
//   - error: 创建过程中出现的错误
//
// 注意:
//   - 如果目录已存在不会报错
//   - 支持同时创建多个目录
func CreateDir(dirs ...string) (err error) {
	for _, v := range dirs {
		exist, err := PathExists(v)
		if err != nil {
			return err
		}
		if !exist {
			if err := os.MkdirAll(v, os.ModePerm); err != nil {
				return err
			}
		}
	}
	return err
}
